home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
351-375
/
373
/
multiplot
/
source
/
mplot_src
/
src.zoo
/
clip.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-02
|
4KB
|
196 lines
#include "struct.h"
#include "plot.h"
#include <graphics/gfxmacros.h>
Clip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
short *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
{
if (*x1<xmin)
{
if (*x2<=xmin) return(FALSE);
else
{
*y1=(short)(*y1+(*y2-*y1)*((FFP)(xmin-*x1)/(FFP)(*x2-*x1)));
*x1=xmin;
}
}
if (*x1>xmax)
{
if (*x2>=xmax) return(FALSE);
else
{
*y1=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmax)/(FFP)(*x1-*x2)));
*x1=xmax;
}
}
if (*x2<xmin)
{
*y2=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmin)/(FFP)(*x1-*x2)));
*x2=xmin;
}
if (*x2>xmax)
{
*y2=(short)(*y1+(*y2-*y1)*((FFP)(xmax-*x1)/(FFP)(*x2-*x1)));
*x2=xmax;
}
if (*y1<ymin)
{
if (*y2<=ymin) return(FALSE);
else
{
*x1=(short)(*x1+(*x2-*x1)*((FFP)(ymin-*y1)/(FFP)(*y2-*y1)));
*y1=ymin;
}
}
if (*y1>ymax)
{
if (*y2>=ymax) return(FALSE);
else
{
*x1=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymax)/(FFP)(*y1-*y2)));
*y1=ymax;
}
}
if (*y2<ymin)
{
*x2=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymin)/(FFP)(*y1-*y2)));
*y2=ymin;
}
if (*y2>ymax)
{
*x2=(short)(*x1+(*x2-*x1)*((FFP)(ymax-*y1)/(FFP)(*y2-*y1)));
*y2=ymax;
}
return(TRUE);
}
ClipPoint(x,y,xmin,ymin,xmax,ymax)
short x,y,xmin,ymin,xmax,ymax;
{
if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
return(TRUE);
}
QuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
short x,*y1,*y2,xmin,ymin,xmax,ymax;
{
if (x<xmin) return(FALSE);
if (x>xmax) return(FALSE);
if (*y1<ymin)
{
if (*y2<=ymin) return(FALSE);
*y1=ymin;
}
if (*y1>ymax)
{
if (*y2>=ymax) return(FALSE);
*y1=ymax;
}
if (*y2<ymin) *y2=ymin;
if (*y2>ymax) *y2=ymax;
return(TRUE);
}
FFPClip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
FFP *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
{
if (*x1<xmin)
{
if (*x2<=xmin) return(FALSE);
else
{
*y1=(*y1+(*y2-*y1)*((xmin-*x1)/(*x2-*x1)));
*x1=xmin;
}
}
if (*x1>xmax)
{
if (*x2>=xmax) return(FALSE);
else
{
*y1=(*y1+(*y2-*y1)*((*x1-xmax)/(*x1-*x2)));
*x1=xmax;
}
}
if (*x2<xmin)
{
*y2=(*y1+(*y2-*y1)*((*x1-xmin)/(*x1-*x2)));
*x2=xmin;
}
if (*x2>xmax)
{
*y2=(*y1+(*y2-*y1)*((xmax-*x1)/(*x2-*x1)));
*x2=xmax;
}
if (*y1<ymin)
{
if (*y2<=ymin) return(FALSE);
else
{
*x1=(*x1+(*x2-*x1)*((ymin-*y1)/(*y2-*y1)));
*y1=ymin;
}
}
if (*y1>ymax)
{
if (*y2>=ymax) return(FALSE);
else
{
*x1=(*x1+(*x2-*x1)*((*y1-ymax)/(*y1-*y2)));
*y1=ymax;
}
}
if (*y2<ymin)
{
*x2=(*x1+(*x2-*x1)*((*y1-ymin)/(*y1-*y2)));
*y2=ymin;
}
if (*y2>ymax)
{
*x2=(*x1+(*x2-*x1)*((ymax-*y1)/(*y2-*y1)));
*y2=ymax;
}
return(TRUE);
}
FFPClipPoint(x,y,xmin,ymin,xmax,ymax)
FFP x,y,xmin,ymin,xmax,ymax;
{
if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
return(TRUE);
}
FFPQuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
FFP x,*y1,*y2,xmin,ymin,xmax,ymax;
{
if (x<xmin) return(FALSE);
if (x>xmax) return(FALSE);
if (*y1<ymin)
{
if (*y2<=ymin) return(FALSE);
*y1=ymin;
}
if (*y1>ymax)
{
if (*y2>=ymax) return(FALSE);
*y1=ymax;
}
if (*y2<ymin) *y2=ymin;
if (*y2>ymax) *y2=ymax;
return(TRUE);
}